/*
 * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package javax.swing.colorchooser;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.io.Serializable;

/**
  * A better GridLayout class
  *
  * @author Steve Wilson
  */
class SmartGridLayout implements LayoutManager, Serializable {

    int rows = 2;
    int columns = 2;
    int xGap = 2;
    int yGap = 2;
    int componentCount = 0;
    Component[][] layoutGrid;

    public SmartGridLayout(int numColumns, int numRows) {
        rows = numRows;
        columns = numColumns;
        layoutGrid = new Component[numColumns][numRows];

    }

    public void layoutContainer(Container c) {

        buildLayoutGrid(c);

        int[] rowHeights = new int[rows];
        int[] columnWidths = new int[columns];

        for (int row = 0; row < rows; row++) {
            rowHeights[row] = computeRowHeight(row);
        }

        for (int column = 0; column < columns; column++) {
            columnWidths[column] = computeColumnWidth(column);
        }

        Insets insets = c.getInsets();

        if (c.getComponentOrientation().isLeftToRight()) {
            int horizLoc = insets.left;
            for (int column = 0; column < columns; column++) {
                int vertLoc = insets.top;

                for (int row = 0; row < rows; row++) {
                    Component current = layoutGrid[column][row];

                    current.setBounds(horizLoc, vertLoc, columnWidths[column], rowHeights[row]);
                    //  System.out.println(current.getBounds());
                    vertLoc += (rowHeights[row] + yGap);
                }
                horizLoc += (columnWidths[column] + xGap);
            }
        } else {
            int horizLoc = c.getWidth() - insets.right;
            for (int column = 0; column < columns; column++) {
                int vertLoc = insets.top;
                horizLoc -= columnWidths[column];

                for (int row = 0; row < rows; row++) {
                    Component current = layoutGrid[column][row];

                    current.setBounds(horizLoc, vertLoc, columnWidths[column], rowHeights[row]);
                    //  System.out.println(current.getBounds());
                    vertLoc += (rowHeights[row] + yGap);
                }
                horizLoc -= xGap;
            }
        }

    }

    public Dimension minimumLayoutSize(Container c) {

        buildLayoutGrid(c);
        Insets insets = c.getInsets();

        int height = 0;
        int width = 0;

        for (int row = 0; row < rows; row++) {
            height += computeRowHeight(row);
        }

        for (int column = 0; column < columns; column++) {
            width += computeColumnWidth(column);
        }

        height += (yGap * (rows - 1)) + insets.top + insets.bottom;
        width += (xGap * (columns - 1)) + insets.right + insets.left;

        return new Dimension(width, height);

    }

    public Dimension preferredLayoutSize(Container c) {
        return minimumLayoutSize(c);
    }

    public void addLayoutComponent(String s, Component c) {
    }

    public void removeLayoutComponent(Component c) {
    }

    private void buildLayoutGrid(Container c) {

        Component[] children = c.getComponents();

        for (int componentCount = 0; componentCount < children.length; componentCount++) {
            //      System.out.println("Children: " +componentCount);
            int row = 0;
            int column = 0;

            if (componentCount != 0) {
                column = componentCount % columns;
                row = (componentCount - column) / columns;
            }

            //      System.out.println("inserting into: "+ column +  " " + row);

            layoutGrid[column][row] = children[componentCount];
        }
    }

    private int computeColumnWidth(int columnNum) {
        int maxWidth = 1;
        for (int row = 0; row < rows; row++) {
            int width = layoutGrid[columnNum][row].getPreferredSize().width;
            if (width > maxWidth) {
                maxWidth = width;
            }
        }
        return maxWidth;
    }

    private int computeRowHeight(int rowNum) {
        int maxHeight = 1;
        for (int column = 0; column < columns; column++) {
            int height = layoutGrid[column][rowNum].getPreferredSize().height;
            if (height > maxHeight) {
                maxHeight = height;
            }
        }
        return maxHeight;
    }

}
